export const patchLines = ( lines: string[], appends: string[], position: "head" | "tail" = "head", ): string[] => { let appendsIndex = 0; for (const line of lines) { if (line.trim() == appends[appendsIndex].trim()) { if (appendsIndex == appends.length - 1) { // appendsと完全に一致するパターンが発見されたので行を挿入せずに終了する return lines; } ++appendsIndex; } else { // 何もしない // appendsIndex = 0; } } // 一致するパターンが見つからなかった場合はappendsを挿入する switch (position) { case "head": return [...appends, ...lines]; case "tail": return [...lines, ...appends]; } }; /** queryに合致するlinesの終了行を返す */ export const findSplitIndex = ( lines: string[], query: string[], ): number | null => { let queryCount = 0; for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) { if (lines[lineIndex].trim() == query[queryCount].trim()) { if (queryCount == query.length - 1) return Number(lineIndex); ++queryCount; } } return null; };